<?php
//Класс, определяющий по url контроллер, метод и параметры
class Router {
	//Выделяем сегменты из текущей url, убирая базовую директорию
	public static function getSegments() {
		$url = parse_url($_SERVER['REQUEST_URI']);
		
        //Убираем начальный слеш
        $url = substr($url['path'], 1);
        
        //Убираем и конечный слеш, если есть
        if ($url[strlen($url)-1] == '/')
            $url = substr($url, 0, -1);
        
        //Сохраняем текущую ссылку
        Local::set('url', BASE_URL.$url);
        //Убираем базовую директорию
        $url = substr($url, strlen(BASE_FOLDER));
       
	    //Опускаем дефисы до символов подчёркивания. Это нужно, потому что дефис хуже чем подчёркивание
        //например, не участвует в w+, это мелочи, но много где ещё тоже возникают проблемы
        $url = str_replace('-', '_', $url);   
	   
	    //Роутинг
		$url = Router::routing($url);
	   
	    //Выделяем сегменты
	    $segments = array_filter(explode('/', $url));
		
        //Убираем недопустимые символы
        array_walk($segments, 'clear_url');
		
		return $segments;
	}
	    
    //Возвращает параметры текущего запроса: имя контроллера, методы, массив дополнительных параметров
    public static function request() {    	
    	$segments = Router::getSegments();
        
        $first = array_shift($segments);
		
		$application = 'application';
		
		$app_url = BASE_URL;
		
		//Проверяем не является ли это административной частью
		if ($first == 'administration' || $first == 'builder') {
		    $application = $first;
			$first = array_shift($segments);
			$app_url .= $application.'/';			
		}
        
		define('APP_URL', $app_url);
		$app_path = ($application == 'application')? $app_url.'application/':$app_url;
		define('APP_PATH', $app_path);
		
		$is_service = FALSE;			
	    //Не является ли это обращением к сервисам
		if ($first == 'services') {
			$is_service = TRUE;
			$first = array_shift($segments);
		}
		
		$controller_name = $first;
		
		if (!$controller_name ) $controller_name  = 'main';
    
        $method_name = array_shift($segments);
    
        if (!$method_name) $method_name = 'index';
    
        $params = $segments;

        return compact('controller_name', 'method_name', 'params', 'is_service', 'application');
    }   
    
    //Преобразование url в соответствии с настройками роутинга
    private static function routing($url) {
        $rules = Config::get('routes');
        if ($rules) {
            $reg_rules = array();
            //Преобразуем правила в регулярные выражения
            foreach ($rules as $key=>$value) {
                $key = str_replace('/', '\\/', $key);
                $key = str_replace('(:num)','(\d+)' , $key);
				$key = str_replace('(:any)', '(\w+)', $key);                
                $key = '/^'.$key.'$/';
                $reg_rules[$key] = $value;
            }

            return preg_replace(array_keys($reg_rules), array_values($reg_rules), $url);
        }
        else
            return $url;
        
    }
}
?>